'use strict'

process.chdir(__dirname)

const config = require('./config/config.js')
const cdpc = require('cdpc')

;((async () => {
    console.log('正在初始化数据库服务···')
    /**
     * cdpc是基于child_process开发的子进程管理扩展，主要为了在Node.js中让复杂的进程管理变得简单而设计。
     * 它可以运行JS文件以及系统上的任何其他命令，比如 shell脚本、编译好的程序等。
     * {@link https://gitee.com/daoio/cdpc}
     */
    const cm = new cdpc()

    await new Promise((rv, rj) => {
      //启动数据库服务。
      cm.runChilds([{
          name: 'postgres',
          command: `..\\${config.pgsqlVersion}\\bin\\postgres.exe`,
          cwd: __dirname + '\\..\\',
          args: [
            '-D', `${__dirname}\\..\\${config.pgsqlVersion}-data`, '-p', config.dbconfig.port || 5432
          ],
          restart: 'fail-count',
          restartLimit: 10,
          //重启延迟为1000毫秒
          restartDelay: 1000,
          onError: err => {
            console.error(err)
            rj(err)
          },
          /**
           * @param {object} ch child_process模块。
           * @param {object} cm 就是new cdpc后的返回值。
           */
          callback: (ch, cm) => {
            ch.on('spawn', code => {
              rv(code)
            })

            ch.on('exit', code => {
              if (!code) console.error('Exit with code', code)
            })
          }
  
        }])
    })

    return cm
  
  })()).then(async (cm) => {
    //数据库进程运行后，需要等待数据库初始化。
    await new Promise((rv) => { setTimeout(() => {rv()}, 750) })
  
    //运行自动同步数据库表结构程序。
    cm.add({
      name: 'init-db',
      file: 'dbsync.js',
      //失败后自动重启
      restart: 'fail-count',
      //限制仅重启1次
      restartLimit: 1,
      //运行完成后自动移除子进程配置项。
      autoRemove: true,
      options: {
        stdio: ['ignore', 1, 2]
      },
      callback: (ch, cm) => {
        ch.on('spawn', () => {
          console.log('同步数据表结构···')
        })
      }
    });
})
